// 用户相关的逻辑控制单元
// 引入数据库文件
const db = require('../config/db')
const bcrypt = require('bcryptjs')
// 引入jwt
const jwt = require('jsonwebtoken')
// 引入秘钥文件
const {jwtSecretKey} = require('../config/jwtSecretKey')

// 图片列表
const imgList = [
    'https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/10.jpeg',
    'https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/11.jpeg',
    'https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/12.jpeg',
    'https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/13.jpeg',
    'https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/14.jpeg',
    'https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/15.jpeg',
    'https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/16.jpeg',
    'https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/17.jpeg',
    'https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/18.jpeg',
    'https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/19.jpeg'
];
// 生成随机数
const randomNum = Math.floor(Math.random() * 10 +1);
/**
 * 注册的控制器
 * @param {*} req 
 * @param {*} res 
 * @returns 
 */
exports.registerController = (req, res) => {
    // 接收数据
    const body = req.body
    // 结构body
    const name = body.name
    const pwd = body.pwd
    // const {name, pwd} = body
    // 判断用户和密码是否为空
    if(!name || !pwd){
        return res.send({
            code: 1,
            msg: '用户名或密码不能为空'
        })
    }
    // 判断用户是否存在
    const userSelectSql = 'SELECT * FROM user WHERE name = ?';
    db.query(userSelectSql, name, (err, res) => {
        if(err){
            return res.send({
                code: 1,
                msg: '查询用户失败'
            })
        }
        console.log(res)
        // res数组如果不为空，说明当前用户名已存在，反之不存在
        if(res.length>0){
            return res.send({
                code: 1,
                msg: '用户名已存在'
            })
        }
    })

    // 密码加密
    const pwdB = bcrypt.hashSync(pwd, 10)
    // 执行sql语句
    const sql = 'INSERT INTO user (name,pwd,head_img) VALUE (?,?,?)' // 占位符
    db.query(sql, [name, pwdB, imgList[randomNum]], (err, data) => {
        if(err){
            return res.send({
                code: 1,
                msg: '注册失败'
            })
        }
        res.send({
            code: 0,
            msg: '注册成功'
        });
    })
}

/**
 * 登录的控制器
 * @param {*} req 
 * @param {*} res 
 * @returns 
 */
exports.loginController = (req, res) => {
    // 接收数据
    const body = req.body
    // 结构body
    let name = body.name
    let pwd = body.pwd
    console.log(name, pwd)
    // 先判断用户名是否存在
    const userSelectSql = 'SELECT * FROM user WHERE name = ?'
    db.query(userSelectSql, name, (err, results) => {
        // err 错误对象
        if(err){
            return res.send({
                code: 1,
                msg: '查询用户失败'
            })
        }
        console.log(results)
        // 账号是否存在
        if(results.length === 0){
            // 用户名不存在
            console.log('用户名不存在')
            return res.send({
                code: 1,
                msg: '用户名不存在'
            })
        }
        // 账号存在，再判断密码是否正确，使用bcrypt解密
        // 参数1：用户输入的密码 ； 参数2：数据库密码
        const compareState = bcrypt.compareSync(pwd, results[0].pwd)
        console.log('判断密码：',compareState)
        // 密码是否正确
        if(!compareState){
            return res.send({
                code: 1,
                msg: '密码不正确'
            })
        }
        // 获取用户信息，剔除用户密码，不要把用户的密码一起发给前端，不安全
        const user = {...results[0], pwd: ''}
        console.log("--用户信息--")
        console.log(user)
        // 生成token
        const token = jwt.sign(user,jwtSecretKey,{expiresIn:'24h'})
        console.log(token)
        // 将token响应给客户端
        // 密码正确，返回数据
        res.send({
            code: 0,
            msg: '登录成功',
            token:'Bearer ' + token
        })
    })

}

/**
 * 用户信息查询逻辑
 * @param {*} req 
 * @param {*} res 
 */
exports.userInfoController=(req,res)=>{
    // 获取token
    const token = req.headers.authorization
    console.log(token)
    // 解析token，获取用户信息
    const userInfo = jwt.verify(token.split('Bearer ')[1],jwtSecretKey)
    console.log(userInfo)
    res.send({
        code: 0,
        msg: '获取用户信息成功',
        data: userInfo
    })
}